package com.sea.utils;


import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;

import java.util.Map;

public class StructUtils {

	/**
	 * byte转起始标志
	 * 
	 * @param bt
	 * @return
	 */
	public static long startTag(byte bt) {
		int tag = bt & 0xff;
		return tag;
	}

	/**
	 * 起始标志转byte
	 * 
	 * @param o
	 * @return
	 */
	public static byte startTag(long o) {
		return ((Long) o).byteValue();
	}

	/**
	 * byte转数据长度
	 * 
	 * @param bt
	 * @return
	 */
	public static long dataLength(byte bt) {
		int tag = bt & 0xff;
		return tag;
	}

	/**
	 * 数据长度转byte
	 * 
	 * @param o
	 * @return
	 */
	public static byte dataLength(long o) {
		return ((Long) o).byteValue();
	}

	/**
	 * bytes转序列号
	 * 
	 * @param bytes
	 * @return
	 */
	public static long serialNum(byte[] bytes) {
		long int1 = bytes[0] & 0xff;
		long int2 = (bytes[1] & 0xff) << 8;

		return int1 | int2;
	}

	/**
	 * 序列号转bytes
	 * 
	 * @return
	 */
	public static byte[] serialNum(long o) {
		byte[] bytes = new byte[2];
		bytes[0] = (byte) o;
		bytes[1] = (byte) (o >> 8);
		return bytes;
	}

	/**
	 * byte转加密标志
	 * 
	 * @param bt
	 * @return
	 */
	public static long encrypt(byte bt) {
		int tag = bt & 0xff;
		return tag;
	}

	/**
	 * 加密标志转byte
	 * 
	 * @param o
	 * @return
	 */
	public static byte encrypt(long o) {
		return ((Long) o).byteValue();
	}

	/**
	 * byte转帧类型标志
	 * 
	 * @param bt
	 * @return
	 */
	public static long type(byte bt) {
		int tag = bt & 0xff;
		return tag;
	}

	/**
	 * 帧类型标志转byte
	 * 
	 * @param o
	 * @return
	 */
	public static byte type(long o) {
		return ((Long) o).byteValue();
	}

	/**
	 * bytes转结束标记
	 * 
	 * @param bytes
	 * @return
	 */
	public static long endTag(byte[] bytes) {
		long int1 = bytes[0] & 0xff;
		long int2 = (bytes[1] & 0xff) << 8;

		return int1 | int2;
	}

	/**
	 * 结束标记转bytes
	 * 
	 * @param o
	 * @return
	 */
	public static byte[] endTag(long o) {
		byte[] bytes = new byte[2];
		bytes[0] = (byte) o;
		bytes[1] = (byte) (o >> 8);
		return bytes;
	}

	public static <T> T setNumberValueToString(T json) {
		if (json instanceof JSONObject) {
			JSONObject newJSON = new JSONObject();
			JSONObject jsonObject = (JSONObject) json;
			for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
				Object value = entry.getValue();
				if (value instanceof Number) {
					newJSON.put(entry.getKey(), entry.getValue().toString());
				} else if (value instanceof JSONObject) {
					newJSON.put(entry.getKey(), setNumberValueToString(value));
				} else if (value instanceof JSONArray) {
					newJSON.put(entry.getKey(), setNumberValueToString(value));
				} else {
					newJSON.put(entry.getKey(), entry.getValue());
				}
			}
			return (T) newJSON;
		}
		if (json instanceof JSONArray) {
			JSONArray newJSONArray = new JSONArray();
			JSONArray valueArray = (JSONArray) json;
			for (Object o : valueArray) {
				newJSONArray.add(setNumberValueToString(o));
			}
			return (T) newJSONArray;
		}
		if (json instanceof Number) {
			return (T) json.toString();
		}
		return json;
	}

}
